package opt;

import java.util.Set;
import java.util.TreeSet;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import on.Nodo;
import on.Red;
import on.Solicitud;



@Entity
public class Caso {
	
	@Id
	private String nombre;
	
	@ManyToOne
	Red red;
	
	@OneToMany(cascade=CascadeType.ALL)
	Set<Solicitud> solicitudes;

	public Red getRed() {
		return red;
	}

	public void setRed(Red red) {
		this.red = red;
	}

	public Set<Solicitud> getSolicitudes() {
		return solicitudes;
	}

	public void setSolicitudes(Set<Solicitud> solicitudes) {
		this.solicitudes = new TreeSet<Solicitud>(solicitudes);
	}
	
	public Caso(){}
	
	/**
	 * Crea un caso randomico.
	 * 
	 * @param red				Red
	 * @param cantSolicitudes	Cantidad de solicitudes que se generaran
	 * @param probNiveles		Probabilidades de que una solicitud tenga un nivel de calidad dado(Oro=0,Plata=1,Bronce=2).
	 * 							Se asume que las probabilidades suman 1.
	 */
	public Caso(Red red, int cantSolicitudes){
		this.red = red;
		
		solicitudes = new TreeSet<Solicitud>();
				
		for(int i = 0 ; i < cantSolicitudes; i++){
			Solicitud s = null;
			
			Nodo origen = red.randomNodo();
			Nodo destino = red.randomNodo();
			
			while (origen.equals(destino)) destino = red.randomNodo();
						
			int anchoDeBanda = (int) (Math.random()*(red.getW()*red.getT()));
			s = new Solicitud(this, origen, destino, anchoDeBanda);
			solicitudes.add(s);
		}
	}
	
	public Caso(Red red){
		this.red = red;
		solicitudes = new TreeSet<Solicitud>();
	}
	
	public void allVsAll( int bandwidth ){
		for(Nodo origen: red.getNodos()){
			for(Nodo destino: red.getNodos()){
				if ( origen.equals(destino)) continue;
				
				solicitudes.add( new Solicitud(this, origen, destino, bandwidth) );
			}
		}
	}
	
	@Override
	public String toString() {
		return nombre;
	}
	
	

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
}
